package com.wyp.demo.pattern.singleton.enumt;

/**
 * 枚举的使用
 * 声明: 使用关键字 enum  枚举中的每一个项叫做枚举项,之间用逗号,最后一个使用分号(如果后面没有方法或者属性可以省略,但是不建议省略)
 * 枚举:可以包括枚举项,是一个或者多个,(单例模式实现方式,枚举项只有一个),包括成员变量,成员方法,构造方法等,为该枚举项的数据部分.枚举类中还可以有抽象方法,但是每一个实例枚举都
 * 必须重写该方法,也就是说每一个枚举实例都是这个枚举类的一个子类实例.
 * 枚举类都默认继承 Enum类
 *
 * @author: Oliver
 * @time: 2020/11/14/20:47
 */
public class DirectionEnum {
    private DirectionEnum() {
    }

    /**
     * 枚举单例的实现,枚举的单例实现实际上是懒汉模式的单例实现,通过打印反编译class可以看出来,
     * 其实在Direction枚举类中,使用静态代码块进行初始化成员变量.
     *
     * @return
     */
    public DirectionEnum getInstance() {
        // 调用枚举的方法
        Direction.AFTER.function();
        Direction.AFTER.fun();
        return Direction.AFTER.instance;
    }


    private enum Direction {
        FRON("fron") {
            @Override
            void function() {

            }
        }, AFTER("after") {
            @Override
            void function() {

            }
        }, LEFT("left") {
            @Override
            void function() {

            }
        }, RIGHT("right") {
            @Override
            void function() {

            }
        };
        String name;
        DirectionEnum instance;


        Direction(String name) {
            this.name = name;
            instance = new DirectionEnum();
        }

        /**
         * 枚举中可以存在方法
         */
        public void fun() {
            System.out.println("aweqw");
        }

        abstract void function();
    }
}
